feat: add stateless_sse option for SSE transport#1845
feat: add stateless_sse option for SSE transport#1845jayhemnani9910 wants to merge 1 commit intomodelcontextprotocol:mainfrom
Conversation
Add a stateless_sse parameter to FastMCP that bypasses the MCP protocol
initialization handshake for SSE transport. This mirrors the existing
stateless_http option for Streamable HTTP transport.
When stateless_sse=True, the server allows tool calls without waiting
for the InitializeRequest → InitializeResponse → InitializedNotification
handshake to complete. This fixes issues with fast clients like Claude
Code that may send requests before initialization completes.
Usage:
mcp = FastMCP("my-server", stateless_sse=True)
Fixes modelcontextprotocol#1844
Github-Issue: modelcontextprotocol#1844
Reported-by: Tech-Fumi
There was a problem hiding this comment.
Pull request overview
This PR adds a stateless_sse configuration option to FastMCP that mirrors the existing stateless_http functionality, allowing the SSE transport to bypass the MCP protocol initialization handshake. This addresses issue #1844 where fast clients like Claude Code send requests before initialization completes, causing RuntimeError: Received request before initialization was complete.
Key Changes:
- Added
stateless_sseboolean field to theSettingsclass with appropriate documentation - Added
stateless_sseparameter toFastMCP.__init__()with a default value ofFalse - Modified the
handle_ssemethod insse_app()to passstateless=self.settings.stateless_ssetoserver.run()
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/mcp/server/fastmcp/server.py | Adds stateless_sse configuration option to Settings class and FastMCP constructor, passing it through to server.run() in SSE handler |
| tests/shared/test_sse.py | Adds comprehensive integration test for stateless SSE mode with helper functions to create and run a stateless test server |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Thanks for the PR! The linked issue hasn't been triaged yet — per our CONTRIBUTING.md, please wait for maintainer feedback before starting work. Closing for now; feel free to reopen once the issue is labeled |
Body:
Summary
Add a
stateless_sseparameter to FastMCP that bypasses the MCP protocol initialization handshake for SSE transport, fixing issues where fast clients send requests before initialization completes.Changes
stateless_ssefield toSettingsclass in FastMCPstateless_sseparameter toFastMCP.__init__()(default:False)stateless=self.settings.stateless_ssetoserver.run()insse_app()methodProblem
When Claude Code (or other fast clients) connects via SSE transport, tool call requests can arrive before the initialization handshake completes, causing:
RuntimeError: Received request before initialization was completeSolution
Mirror the existing
stateless_httpoption by addingstateless_sse. When enabled, bypasses the initialization barrier.Testing
test_sse_stateless_mode_allows_requests_without_initializationFixes #1844